package com.project.forlearningdemo.utils;

import com.project.forlearningdemo.pojo.vo.Info;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;

/**
 * 分页工具
 */
@Configuration
public class PageInfoUtil<T>{

    public static final int LIMITPAGE = 12;

    /**
     * 刷新页数info
     * 先从数据库拿取需要的全部数据，并设置list
     * 设置当前页数 page
     * 设置页面大小 limitPage
     * 设置info info
     */
    public Info<T> resetPage(int page, int limitPage, List<T> list, Info<T> info) throws IndexOutOfBoundsException{
        // 范围限制
        if(page <= 0 || limitPage <= 0)
            throw new IndexOutOfBoundsException();

        int pages;//总页数
        int size = list.size();//总数

        //设置资源总数
        info.setSum(size);
        //如果资源个数为0
        if(size==0)  {
            return setInfoWhenProIsNull(info);
        }

        if(size%limitPage==0){
            pages = size/limitPage;
        }else{
            pages = size/limitPage+1;
        }

        List<T> productInfoList;
        int minP, maxP;
        //如果当前页数不等于总页数 即非最后一页
        if(page < pages){
            minP = (page-1)*limitPage;
            maxP = page*limitPage;
            productInfoList = list.subList(minP, maxP);
        }else if(page == pages){
            //如果当前页数等于总页数 即最后一页
            minP = (page-1)*limitPage;//(pages-1)*limitPage
            maxP = size;//size
            productInfoList = list.subList(minP, maxP);
        }else{
            //如果当前页数大于总页数 当前页面数更改后但仍然使用原来的页面但是超过页面数
            //由于数据操作影响数量变化导致,例如增删
            //默认为最后一页
            minP = (pages-1)*limitPage;
            maxP = size;
            productInfoList = list.subList(minP, maxP);

            return setSplitPage(productInfoList, pages, pages, info);
        }

        return setSplitPage(productInfoList, pages, page, info);
    }

    /**
     * 代码简化：设置分页
     */
    private Info<T> setSplitPage(List<T> list, int maxPage, int page, Info<T> info){

        //设置 每一页对应的列
        info.setList(list);
        //设置当前页
        info.setPageNum(page);
        //设置前一页
        if(page==1) info.setPrePage(maxPage);
        else info.setPrePage(page-1);
        //设置后一页
        if(page==maxPage) info.setNextPage(1);
        else info.setNextPage(page+1);
        //设置总页数
        info.setPages(maxPage);

        return info;
    }

    /**
     * 当info中物品个数为空
     */
    private Info<T> setInfoWhenProIsNull(Info<T> info){
        info.setList(new ArrayList<>());//空的对象
        info.setPageNum(1);
        info.setNextPage(1);
        info.setPrePage(1);
        info.setPages(1);
        return info;
    }
}
